home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 July / macformat-026.iso / mac / Shareware City / Developers / berkeleydb1.73 / Berkeley_db / btree / bt_close.c next >
Encoding:
C/C++ Source or Header  |  1994-07-27  |  5.2 KB  |  214 lines  |  [TEXT/MPS ]

  1. /*-
  2.  * Copyright (c) 1990, 1993
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * Mike Olson.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *    This product includes software developed by the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  */
  36.  
  37. #if defined(LIBC_SCCS) && !defined(lint)
  38. static char sccsid[] = "@(#)bt_close.c    8.2 (Berkeley) 9/7/93";
  39. #endif /* LIBC_SCCS and not lint */
  40.  
  41. #if defined(macintosh) && (defined(powerc) || defined(__powerc))
  42. #include "OurMalloc.h"
  43. #endif
  44.  
  45. #ifndef macintosh
  46. #include <sys/param.h>
  47. #endif
  48.  
  49. #include <errno.h>
  50. #include <stdio.h>
  51. #include <stdlib.h>
  52. #include <string.h>
  53.  
  54. #ifndef macintosh
  55. #include <unistd.h>
  56. #endif
  57.  
  58. #include <db.h>
  59. #include "btree.h"
  60.  
  61. static int bt_meta __P((BTREE *));
  62.  
  63. /*
  64.  * BT_CLOSE -- Close a btree.
  65.  *
  66.  * Parameters:
  67.  *    dbp:    pointer to access method
  68.  *
  69.  * Returns:
  70.  *    RET_ERROR, RET_SUCCESS
  71.  */
  72. int
  73. __bt_close(dbp)
  74.     DB *dbp;
  75. {
  76.     BTREE *t;
  77.     int fd;
  78.  
  79.     t = dbp->internal;
  80.  
  81.     /* Toss any page pinned across calls. */
  82.     if (t->bt_pinned != NULL) {
  83.         mpool_put(t->bt_mp, t->bt_pinned, 0);
  84.         t->bt_pinned = NULL;
  85.     }
  86.  
  87.     /*
  88.      * Delete any already deleted record that we've been saving
  89.      * because the cursor pointed to it.
  90.      */
  91.     if (ISSET(t, B_DELCRSR) && __bt_crsrdel(t, &t->bt_bcursor))
  92.         return (RET_ERROR);
  93.  
  94.     if (__bt_sync(dbp, 0) == RET_ERROR)
  95.         return (RET_ERROR);
  96.  
  97.     if (mpool_close(t->bt_mp) == RET_ERROR)
  98.         return (RET_ERROR);
  99.  
  100.     if (t->bt_stack)
  101.         free(t->bt_stack);
  102.     if (t->bt_kbuf)
  103.         free(t->bt_kbuf);
  104.     if (t->bt_dbuf)
  105.         free(t->bt_dbuf);
  106.  
  107.     fd = t->bt_fd;
  108.     free(t);
  109.     free(dbp);
  110.     return (close(fd) ? RET_ERROR : RET_SUCCESS);
  111. }
  112.  
  113. /*
  114.  * BT_SYNC -- sync the btree to disk.
  115.  *
  116.  * Parameters:
  117.  *    dbp:    pointer to access method
  118.  *
  119.  * Returns:
  120.  *    RET_SUCCESS, RET_ERROR.
  121.  */
  122. int
  123. __bt_sync(dbp, flags)
  124.     const DB *dbp;
  125.     u_int flags;
  126. {
  127.     BTREE *t;
  128.     int status;
  129.     PAGE *h;
  130.     void *p;
  131.  
  132.     t = dbp->internal;
  133.  
  134.     /* Toss any page pinned across calls. */
  135.     if (t->bt_pinned != NULL) {
  136.         mpool_put(t->bt_mp, t->bt_pinned, 0);
  137.         t->bt_pinned = NULL;
  138.     }
  139.  
  140.     /* Sync doesn't currently take any flags. */
  141.     if (flags != 0) {
  142.         errno = EINVAL;
  143.         return (RET_ERROR);
  144.     }
  145.  
  146.     if (ISSET(t, B_INMEM | B_RDONLY) || !ISSET(t, B_MODIFIED))
  147.         return (RET_SUCCESS);
  148.  
  149.     if (ISSET(t, B_METADIRTY) && bt_meta(t) == RET_ERROR)
  150.         return (RET_ERROR);
  151.  
  152.     /*
  153.      * Nastiness.  If the cursor has been marked for deletion, but not
  154.      * actually deleted, we have to make a copy of the page, delete the
  155.      * key/data item, sync the file, and then restore the original page
  156.      * contents.
  157.      */
  158.     if (ISSET(t, B_DELCRSR)) {
  159.         if ((p = malloc(t->bt_psize)) == NULL)
  160.             return (RET_ERROR);
  161.         if ((h = mpool_get(t->bt_mp, t->bt_bcursor.pgno, 0)) == NULL)
  162.             return (RET_ERROR);
  163.         memmove(p, h, t->bt_psize);
  164.         if ((status =
  165.             __bt_dleaf(t, h, t->bt_bcursor.index)) == RET_ERROR)
  166.             goto ecrsr;
  167.         mpool_put(t->bt_mp, h, MPOOL_DIRTY);
  168.     }
  169.         
  170.     if ((status = mpool_sync(t->bt_mp)) == RET_SUCCESS)
  171.         CLR(t, B_MODIFIED);
  172.  
  173. ecrsr:    if (ISSET(t, B_DELCRSR)) {
  174.         if ((h = mpool_get(t->bt_mp, t->bt_bcursor.pgno, 0)) == NULL)
  175.             return (RET_ERROR);
  176.         memmove(h, p, t->bt_psize);
  177.         free(p);
  178.         mpool_put(t->bt_mp, h, MPOOL_DIRTY);
  179.     }
  180.     return (status);
  181. }
  182.  
  183. /*
  184.  * BT_META -- write the tree meta data to disk.
  185.  *
  186.  * Parameters:
  187.  *    t:    tree
  188.  *
  189.  * Returns:
  190.  *    RET_ERROR, RET_SUCCESS
  191.  */
  192. static int
  193. bt_meta(t)
  194.     BTREE *t;
  195. {
  196.     BTMETA m;
  197.     void *p;
  198.  
  199.     if ((p = mpool_get(t->bt_mp, P_META, 0)) == NULL)
  200.         return (RET_ERROR);
  201.  
  202.     /* Fill in metadata. */
  203.     m.m_magic = BTREEMAGIC;
  204.     m.m_version = BTREEVERSION;
  205.     m.m_psize = t->bt_psize;
  206.     m.m_free = t->bt_free;
  207.     m.m_nrecs = t->bt_nrecs;
  208.     m.m_flags = t->bt_flags & SAVEMETA;
  209.  
  210.     memmove(p, &m, sizeof(BTMETA));
  211.     mpool_put(t->bt_mp, p, MPOOL_DIRTY);
  212.     return (RET_SUCCESS);
  213. }
  214.